﻿#ifndef __BPA_INTERFACE_H__
#define __BPA_INTERFACE_H__

// Data types definition
#define STS_SUCCEED  0
#define STS_FAILED   -1

typedef int   STS_MSG ;        // Status Message
typedef char  Str64[65] ;     // a string that contains 64 ascii characters(the end '\0' is not included)
typedef char* TextBlock ;

#include <vector>
#include <BaseCommon.h>

//以下是不合理参数输出的数据结构定义

//最小化潮流结果不合理发电机信息
typedef struct MiniPowerBadGen
{
	char BusType[4];			//发电机节点类型
	char BusName[10];			//(发电机)母线名
	char BusVolBase[10];		//（发电机）基准电压
	char BusZone[4];			//母线分区
	char Pgen[10];			//有功出力
	char PGenMax[10];			//额定有功出力
	char PLoadRate[10];			//发电机有功负载率
	//char PBackupRate[10];		//发电机有功备用率
}MinPfBadGen;
//最小化潮流结果电压越限信息
typedef struct MiniPowerBusBadVol
{
	char BusName[10];			//母线名
	char BusVolBase[10];			//基准电压
	char BusZone[4];			//母线分区
	char BadBusVol[10];			//电压标幺值
}MinPfBusBadVol;

//最小化潮流结果功率因素越限信息
typedef struct MiniPowerBusBadFactor
{
	char BusName[10];		//母线名
	char BusVolBase[10];		//基准电压
	char BusZone[4];		//母线分区
	char BadFactor[10];		//电压标幺值
}MinPfBusBadFactor;

//最小化潮流结果线路损耗越限信息
typedef struct MiniPowerBadLineLoss
{
	char BusStart[10];		//首端母线名
	char StartVolBase[10];		//基准电压
	char BusEnd[10];		//末端母线名
	char EndVolBase[10];		//基准电压
	char BusZone[4];		//线路所在分区（按始端母线所在的分区确定）
	char PLossPercent[10];		//有功损耗百分比
}MinPfBadLineLoss;

//最小化潮流结果线路过载信息
typedef struct MiniPowerBadLineOver
{
	char BusStart[10];		//首端母线名
	char StartVolBase[10];		//基准电压
	char BusEnd[10];		//末端母线名
	char EndVolBase[10];		//基准电压
	char BusZone[4];		//线路所在分区（按始端母线所在的分区确定）
	char LineIrated[10];		//线路额定电流
	char LineI[10];				//实际电流
	char LossPercent[10];		//过载过载百分比
}MinPfBadLineOver;
//最小化潮流结果不平衡信息
typedef struct MiniPowerUbnce
{
	char ZoneName[4];		//分区名
	char Pgen[10];			//分区总有功出力
	char Qgen[10];			//无功出力
	char Pload[10];			//有功负荷
	char Qload[10];			//无功负荷
	char Qshunt[10];		//并联无功
	char Ploss[10];			//有功损耗
	char Qloss[10];			//无功损耗
	char Qget[10];			//线路充电功率
	char QLs[10];			//高抗
	char Psum[10];			//分区有功总结
	char Qsum[10];			//无功总结
}MinPfUbnce;

//最小化潮流残差
typedef struct MinPfRe
{
	char BusName[10];		//母线名
	char BusVolBase[10];	//基准电压
	char BusZone[4];		//母线分区
	char PMinPfRes[10];		//有功残差
	char QMinPfRes[10];		//无功残差
}MinPfRes;

//不良信息展示之拓扑检测结构体
typedef struct IsolateBusInf
{
	char AreaName[16];    //分区名
	char BusName[32];		//母线名
	double BusVol;			//母线电压
}IsolateBus;

//不良信息展示之交流线路结构体
typedef struct LineAcInf
{
	char LineStart[32];			  //线路始端母线名
	double LineStartVol;		 	  //线路始端电压
	char LineEnd[32];			  //线路末端母线名
	double LineEndVol;			  //线路末端电压
	char ShuntFlag[2];			  //线路回路标识号（20141128新增）
	char LineInfor[32];			  //线路型号 （20141126新增）
	double LineR;				  //电阻值
	double R_Proposal;			  //建议修改电阻值
	double LineX;				  //电抗值
	double X_Proposal;			  //建议修改电抗值
	double LineB;				  //电纳值
	double B_Proposal;			  //建议修改电纳值
	double LineLength;			  //线路长度值
	char LinePro[512];			  //线路存在问题
	int LineCheckFlag;
}LineAc;

//不良信息展示之直流线路结构体
typedef struct LineDcInf
{
	char LineStart[32];			  //线路始端母线名
	double LineStartVol;		  //线路始端电压
	char LineEnd[32];			  //线路末端母线名
	double LineEndVol;			  //线路末端电压
	double LineR;				  //电阻值
	double PowerDc;				  //安排直流功率
	double CurrentDc;			  //安排直流电压
	double VoltageDc;			  //整流侧直流电压
	double LineLength;			  //线路长度
	char LinePro[512];	  //线路问题
	int LineCheckFlag;

}LineDc;

//不良信息展示之两卷变压器结构体
typedef struct Transformer2Inf
{
	char TranStart[32];			  //变压器始端母线名
	double TranStartVol;		  //变压器始端电压
	char TranEnd[32];			  //变压器末端母线
	double TranEndVol;			  //变压器末端电压
	double TranCapacity;		  //变压器容量
	double TranX;				  //变压器漏抗值
	char TranPro[512];			  //变压器问题
	char ShuntFlag[2];			  //20141129新增 并联回路标志位
	int TranCheckFlag;
}Transformer2;
//不良信息展示之三卷变压器结构体
typedef struct Transformer3Inf
{
	char TranNameH[32];	  //高压端母线
	char TranNameM[32];	  //中压端母线
	char TranNameL[32];	  //低压端母线
	double TranCapacity;		  //变压器容量
	double TranVolH;			  //变压器高压侧电压
	double TranVolM;			  //变压器中压侧电压
	double TranVolL;			  //变压器低压侧电压
	double TranXHM;				  //变压器高中压测漏抗
	double TranXHL;				  //变压器高低压测漏抗
	double TranXML;				  //变压器中低压侧漏抗
	char TranPro[512];	  //变压器问题
	int TranCheckFlag;
}Transformer3;

//统计信息查询
typedef struct BpaDataSummary
{
	char LineStr[150];			//统计信息
}BpaDataSummary;

//FileList表与界面接口部分2015.7.3
typedef struct FileListInterface
{
	char FileName[200];        //解析的文件名
	char CaseName[100];		   //案例名称
	int CaseID;				   //案例ID
}FileListInterfaceA;


STS_MSG FileListInterface(int*& FileNum, FileListInterfaceA*& FileArry, const char* sDatabasePathName);


#ifdef POWERFLOW_LIB
#define POWER_FLOW_DLLEXPORT _declspec(dllexport)
#else
#define POWER_FLOW_DLLEXPORT _declspec(dllimport)
#endif

// Main function call, all the bellowing functions should return STS_SUCCEED or STS_FAILED
// functions in first page
#include<functional>

typedef std::function<void(void*, char*)> DebugCallBack;
enum LogLevel
{
	Error,
	Info,
	Debug
};
typedef std::function<void(void*, char*, int)>LogCallBack;

#ifdef __cplusplus
extern "C"{
#endif

	void POWER_FLOW_DLLEXPORT register_sdk_debug(DebugCallBack callback);

	void POWER_FLOW_DLLEXPORT register_sdk_log(LogCallBack callback);

	STS_MSG POWER_FLOW_DLLEXPORT BPAInitialize(const char* Database);
	
	// FilePath is like "D:\\folder1\\subfolder\\bpafile.dat"   Database is the address of database
	STS_MSG POWER_FLOW_DLLEXPORT BPAAnalysis(const char* FilePath, const char* Database);
	
	// bad parameter check
	STS_MSG POWER_FLOW_DLLEXPORT BPABadDataCheck(const char* Database, int CaseID);

	// sPath is the pathname where the application installed
	STS_MSG POWER_FLOW_DLLEXPORT BPAMiniPowerFlow(const char* Database, int CaseID);

	STS_MSG POWER_FLOW_DLLEXPORT BPAUnbalanceCheck(const char* Database);

	// FilePath is shown as in above
	STS_MSG POWER_FLOW_DLLEXPORT BPAFileWriteBack(const char* Database, const char* outdat,int CaseID); 

	//执行BPA潮流计算
    STS_MSG POWER_FLOW_DLLEXPORT BPAToExecuteBpa(const char* DatFilePath);

	//规划二期By 罗阳百
	STS_MSG POWER_FLOW_DLLEXPORT BPACompare(const char* Database);

	//数据拼接，寻找差异
	STS_MSG POWER_FLOW_DLLEXPORT BPADatPinJie_FindDifference(const char* Database);

	//数据拼接，执行拼接并回写文件
	STS_MSG POWER_FLOW_DLLEXPORT BPADatPinJie_BpaDatWriteBack(const char* Database,const char* outdat);

	STS_MSG POWER_FLOW_DLLEXPORT SetSwiExecuteBreakCycle(bool bbreakcycle);

    /* 静态安全分析 */

    // N-1计算
    int POWER_FLOW_DLLEXPORT N_1Calculate(std::string filename, JGG::filesystem::CDirectory work_dir);

    // N-2计算
    int POWER_FLOW_DLLEXPORT N_2Calculate(std::string filename, JGG::filesystem::CDirectory work_dir);

    // N-3计算
    int POWER_FLOW_DLLEXPORT N_3Calculate(std::string filename, JGG::filesystem::CDirectory work_dir);
#ifdef __cplusplus
}
#endif

#endif
